|
Date : 29/8/93 Protection : MOT DE PASSE Programme : LOTUS Outils : SOFT-ICE V2.50 Fichier : LOTUS.EXE Temps pass� : 15mn Soci�t� : Gremlin Origine : B. Michel Divers : Cr�ation d'un lanceur Num�ro : 4 Apr�s avoir vu ce que valait la protection de Zool (de la m�me soci�t�), je me suis dit que j'avais certaines chances pour cracker ce jeu-ci. Effectivement, apr�s 2 ou 3 essais je trouve le saut fati- dique qui permet d'arriver au jeu sans avoir rentr� le code. H�las, comme pour Zool, on ne trouve aucune trace dans aucun des fichiers de la cha�ne � patcher. Donc, j'en arrive � cr�er un lanceur et cela fonctionne tr�s bien. Ci-dessous, le saut � changer : 12F4:3099 7408 JZ 30A3 ; Doit devenir un ; JNZ 30A3. Ci-dessous le lanceur en question : ; PATCH POUR LE PROGRAMME LOTUS ; ;****************************************************************************** ; ZONE A INITIALISER adr_ip1 equ 03099h ; Adresse dont le contenu est � modifier. anc_val equ 0874h ; Valeur d'origine � rechercher, invers�e. nouv_val equ 0875h ; Nouvelle valeur (la modif). INT_DET equ 16h ; Le num�ro de l'INT que l'on veut utiliser. BEEP_TONE equ 440 ; Fr�quence de la note. ;****************************************************************************** seg_a segment byte public assume cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a org 100h sto proc far start: jmp init ; r�duire la m�moire et d�placer la db 90h ; pile plus pr�s. paramet dw 0 ; M�me bloc d'environnement. ENVIR dw 0 ; Les param�tres de la ligne de data_3 dw 0 ; commande sont recopi�s ici puis FCB_1 dw 0 ; transmis au programme fils. ( 80h ) data_5 dw 0 FCB_2 dw 0 data_7 dw 0 sauve_SP dw 0 sauve_SS dw 0 data_9 dw 0, 0 drap equ 0 ;------------------------------ PROGRAMME PERE ------------------------------ loc_1: mov sauve_SP,sp mov sauve_SS,ss mov ax,80h mov ENVIR,ax ; Ligne de commande... mov data_3,ds mov ax,5Ch ; Premier FCB ( inutilis� ) mov FCB_1,ax mov data_5,ds mov ax,6Ch ; Second FCB ( inutilis� ) mov FCB_2,ax mov data_7,ds mov ah,35h mov al,INT_DET int 21h ; DOS Services ah=function 35h ; get intrpt vector al in es:bx mov cs:data_9,bx mov word ptr cs:data_9+2,es mov ah,25h mov al,INT_DET lea dx,cs:[_int] ; Load effective addr int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx lea dx,cs:[nom_prg] ; Load effective addr push ds pop es lea bx,cs:[paramet] ; Load effective addr mov al,0 mov ah,4Bh int 21h ; Appel du programme fils. ; run progm @ds:dx, parm @es:bx mov sp,sauve_SP mov ss,sauve_SS cmp al,2 ; teste le code de retour du programme jnz ok ; fils, 02 si pas trouv�. mov dx,offset mess_err mov ah,9 int 21h ; Les cinq instructions suivantes sont facultatives puisque le ; vecteur d'origine est remis en place d�s que le patch est effectu�. ; Le seul but est d'�viter le plantage du PC dans l'hypoth�se o� l'on ; lance le programme p�re et que celui-ci ne trouve pas le programme ; fils. A ce moment l� on remet tout en place et on quitte. ok: mov ah,25h mov al,INT_DET mov dx,cs:data_9 mov ds,word ptr cs:data_9+2 int 21h mov ah,4Ch int 21h ; terminate with al=return code sto endp ;---------------------------- int d�tourn�e -------------------------------- int_entry proc far _int: jmp apres _SAUVE_SP dw 0,0 apres: push ax push ds push bx push cx push dx pushf ; Push flags mov dx,305h in al,dx mov word ptr cs:[_SAUVE_SP],sp mov cx,30 prochain: pop ds dec cx jz s cmp word ptr ds:[adr_ip1],anc_val ; Si ok on patche. jnz prochain mov word ptr ds:[adr_ip1],nouv_val ; On y place le patch. xor bx,bx mov ds,bx ; L'INT 21 n'est pas r�entrante, on ne peut donc pas se servir de ; la fonction 25h ( set int. vector ) mov bx,word ptr cs:data_9 ; Je remets manuellement mov ds:[INT_DET*4],bx ; en place le vecteur mov bx,word ptr cs:data_9+2 ; de l'INT d�tourn�e. mov ds:[INT_DET*4+2],bx mov dx,304h in al,dx ;* Sound - Sounds speaker with the following tone and duration: mov al, 0B6h ; Initialize channel 2 of out 43h, al ; timer chip mov dx, 12h ; Divide 1,193,180 hertz mov ax, 34DCh ; (clock frequency) by mov bx, BEEP_TONE ; desired frequency div bx ; Result is timer clock count out 42h, al ; Low byte of count to timer mov al, ah out 42h, al ; High byte of count to timer mov bx,3 ; Charge BX avec 3 BEEPs main_b: in al, 61h ; Read value from port 61h or al, 3 ; Set first two bits out 61h, al ; Turn speaker on mov dx,3 rebou: mov cx, 0ffffh bou: loopnz bou dec dx jnz rebou in al, 61h ; When time elapses, get port value xor al, 3 ; Kill bits 0-1 to turn out 61h, al ; speaker off dec cx bou1: loopnz bou1 dec bx ; Compteur de boucle. jnz main_b ; Trois bips... s: mov sp,word ptr cs:[_SAUVE_SP] popf pop dx pop cx pop bx pop ds pop ax jmp dword ptr cs:data_9 int_entry endp ;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------ init: ; D�codage du texte. cld ; Pour incr�menter SI et DI. xor ax,ax mov si,offset chaine ; pointe sur le d�but de la chaine. mov di,si ; DI �galement. mov cx,offset chaine_fin - offset chaine ; 28 lignes de 6 caract�res sont XOR�s. ; + mess_err ( 30 ) + nom_prog ( 13 ). toto: lodsb ; On cherche... xor al,ah ; On XOR. stosb ; On remet. xchg ah,al loop toto ; Et on tourne tant que CX # 0. mov ax,1a00h ; Test si carte + moniteur VGA int 10h cmp al,1ah je graf ; Si oui on affiche la fen�tre FREDDY_SOFT. suite1: mov ah,4ah mov bx,offset fin ; Fin du programme en BX. mov cl,4 ; Divis� par 4 pour avoir des paragraphes. shr bx,cl inc bx ; On en rajoute un par s�curit�. int 21h ; Execution de la fonction 4Ah. mov sp,offset fin ; on d�place la pile en "fin" car elle est jmp loc_1 ; plac�e en FFFE dans un programme COM. graf: xor ah,ah ; Raz de l'�cran mov al,3 int 10h mov ax,1301h ; Mode 01 attribut couleur dans BL. mov bx,004bh ; Page 0. mov cx,28 ; nombre de char. mov dx,0a19h ; ligne,colonne. lea bp,cs:[chaine] ligne_suiv: int 10h inc dh add bp,28 cmp dh,10h ; 6 lignes de 28 caract�res. jb ligne_suiv mov ah,2 ; Pour faire disparaitre le curseur. xor bh,bh ; Page ecran 0. mov dh,25 int 10h xor ah,ah int 16h ; Attends un char... jmp suite1 db 55h,0aah ; Identificateur de d�but. chaine: db '�����������CEDRIC���������Ŀ' db '� �' db '� LOTUS Bypass �' db "� I hope you'll enjoy it �" db '� �' db '��� Lan�eur Crypt� V1.1 ����' mess_err db 0ah,0dh,'Programme enfant non trouv�','$' nom_prg db 'lotus.exe',0,0,0 ; 12 car max + nul chaine_fin: db 0aah,55h ; Identificateur de fin. fin_init label near ;----------------------- PLACE RESERVEE POUR LA PILE ------------------------ dw 100 dup (' ') fin equ this byte ; ici le sommet de la pile, SP. seg_a ends end start ;******************************************************************************* C�dric |